思路
使用三个游标:cur指向合并后链表的尾部,l1,l2分别用于遍历两个链表,较小的元素增加到合并后链表。
小技巧
使用冗余的头结点可以精简地判断一下情形,其中一个链表,或两个都为空链表。
从而精简代码。
朴素代码
class Solution { public: ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) { ListNode * head, *ptr; if (!l1 && !l2) return NULL; if (!l1 && l2) return l2; if (l1 && !l2) return l1; if (l1->val > l2->val) { head = l2; l2 = l2->next; } else { head = l1; l1 = l1->next; } ptr = head; while (l1 && l2) { if (l1->val <= l2->val) { ptr->next = l1; l1 = l1->next; } else { ptr->next= l2; l2 = l2->next; } ptr = ptr->next; } if (l1) { ptr->next = l1; } else { ptr->next = l2; } return head; } };
优化代码
class Solution { public: ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) { ListNode dummy(0); ListNode *ptr = &dummy; while (l1 && l2) { if (l1->val <= l2->val) { ptr->next = l1; l1 = l1->next; } else { ptr->next= l2; l2 = l2->next; } ptr = ptr->next; } if (l1) { ptr->next = l1; } else { ptr->next = l2; } return dummy.next; } };