0928力扣算法题(题号19、21、160)

79 阅读2分钟

今天写了几道链表的题目,分别是

(21)合并两个有序链表:leetcode.cn/problems/me…

(160)相交链表:leetcode.cn/problems/in…

(19)删除链表的倒数第N个结点:leetcode.cn/problems/re…

前俩道较简单,后一道中等难度。

(21)合并两个有序链表

题目如下:

21.jpg

其示例如下:

21.jpg

我的想法是:创建一个哑节点,作为合并后链表的头部;采用两个指针分别取值比较,遍历条件为当一方为空,则剩下的链表不需要再继续遍历,直接挂载到末尾。

以下是我的代码:

21.jpg

提交记录:

21.jpg

(160)相交链表

题目如下:

21.jpg

其示例如下:

21.jpg

这里有几个需要注意的点,一个是题目要求结点相等而非结点值相等,所以不可用nodeA == nodeB作为判定条件;其次,不可在每一次循环里简单地同时遍历下一个结点,因为两个链表长度不同。

我的想法是:由于两条链表若相交,从与短链表起始相同位置的长链表开始遍历至尾部,一定可以找到相交点,且此时两个链表可以同时遍历。如图红框部分为相同位置。所以只需要找到b2的位置,然后同时遍历俩链表且同时进行判断地址值是否相等则可以找到相交结点。

21.jpg

以下是我的代码:

21.jpg

提交记录:

21.jpg

(19)删除链表的倒数第N个结点

题目如下:

21.jpg

其示例如下:

21.jpg

这里要特殊考虑删除结点为第一个的情况。

我的想法是:我们可以用三个指针,pdelete指向要删除的结点,p是辅助指针,pend是指向链表末尾的指针。先根据n计算出pdeletepend相差的位置个数,再遍历,使得pend指向末尾(pend.Next == nil),pdelete指向要删除的结点(与pend相差n-1个位置),让p指向pdelete的上一个结点(遍历一遍链表,使p.Next == pdelete),此时,若p==pdelete,直接return head.Next。否则执行p.Next = pdelete.Next,再return head。

21.jpg

以下是我的代码:

21.jpg

提交记录:

21.jpg