将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入:1->2->4, 1->3->4 输出:1->1->2->3->4->4
思路:这道题的思路再明显不过了,就是选择一条主链表,同时设置2个指针分别指向2个链表。if判断节点值的大小,通过指针的操作使主链表不断增长。
代码 beat 90
# Definition for singly-linked list. class ListNode: def __init__(self, x): self.val = x self.next = None class Solution: def mergeTwoLists(self, l1, l2): """ :type l1: ListNode :type l2: ListNode :rtype: ListNode """ i = l1 j = l2 head = l1 #判断2条链表中某条链表为空的情况 if l1 is None: return l2 if l2 is None: return l1 #接下来这一段是在操作什么呢?是在给我们的主链i的原头部节点前加节点 if j.val < i.val: head = j while j.next is not None and j.next.val <= i.val: j = j.next t = j j = j.next t.next = i #i链前的节点加完了,接下来把大于i节点的节点也加入主链 while i != None and j != None: if i.next != None: if i.next.val > j.val: t = j j = j.next t.next = i.next i.next = t i = i.next else: i = i.next else: i.next = j break return head
反思易错:
1.链表的题,需考虑极端情况,比如头部和尾部
这道题关于头部的特殊情况就是当我们往主链头部之前加新节点时,我们改的是新节点的next,让它指向原头部节点
而在中间部分修改时,改的是i指针的next
尾部的特殊情况一直都是越界。