合并两个有序链表(Python and C++解法)
题目:
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/merge-two-sorted-lists
思路:
1. 使用迭代遍历的方法,轮流往后遍历俩链表;
2. 设定一个哨兵节点 "prehead",没有哨兵节点时,添加一个节点要先判断是否是第一个节点,并需要单独保留第一个节点的指针,以便于返回整个链表的头指针,有哨兵节点时,链表头是固定的,不可能为空,后续的节点都是链接在前一个节点的,不需要单独判断是否为头节点;
3. 时间复杂度是O(m+n),过程中没有产生新的链表,只是改变指针指向的关系,所以空间复杂度O(1)
Python解法:
1 class ListNode: # 定义单链表 2 def __init__(self, x): 3 self.val = x 4 self.next = None 5 6 class Solution: 7 @staticmethod 8 def merge_two_lists(l1: ListNode, l2: ListNode) -> ListNode: 9 if l1 is None: 10 return l2 11 if l2 is None: 12 return l1 13 pre_head = ListNode(0) # 定义一个哨兵节点,其位置固定便于返回结果 14 prev = pre_head 15 while l1 and l2: 16 if l1.val < l2.val: 17 prev.next = l1 # 指向较小的节点 18 l1 = l1.next # 读取下一节点 19 else: 20 prev.next = l2 # 指向较小的节点 21 l2 = l2.next # 读取下一节点 22 prev = prev.next # 移动至下一节点 23 24 if l1 is None: 25 prev.next = l2 26 if l2 is None: 27 prev.next = l1 28 return pre_head.next
C++解法:
1 struct ListNode { 2 int val; 3 ListNode *next; 4 ListNode(int x) : val(x), next(NULL) {} 5 }; 6 7 class Solution { 8 public: 9 ListNode *mergeTwoLists(ListNode *l1, ListNode *l2) { 10 if (l1 == NULL) 11 return l2; 12 if (l2 == NULL) 13 return l1; 14 ListNode *preHead = new ListNode(0); // 需要用new建立一个哨兵节点 15 ListNode *prev = preHead; 16 while (l1 != NULL && l2 != NULL) { 17 if (l1->val < l2->val) { 18 prev->next = l1; 19 l1 = l1->next; 20 } 21 else { 22 prev->next = l2; 23 l2 = l2->next; 24 } 25 prev = prev->next; 26 } 27 if (l1 == NULL) 28 prev->next = l2; 29 if (l2 == NULL) 30 prev->next = l1; 31 return preHead->next; 32 } 33 };