21-合并两个有序链表
①、题目描述:
将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
②、想法:
假设一个头结点“prehead”(最后可以比较容易返回合并后的链表),并且维护一个prev指针,我们需要做的是调整它的next指针。
重复过程如下: 如果l1当前的位置小于l2,就把l1的值接到prev节点后面同时将l1往后移动一个;否则对l2做同样的操作。不管把哪
一个元素接在了prev的后面,都要把prev往后移动一个元素。重复该过程直到l1或者l2指向了NULL。
注意:循环结束后,l1和l2至多有一个非空的,由于l1和l2本身就是有序的,所以不管剩的是哪个链表,都可以简单地把他接到prev(合并链)
后面,最后返回合并链就行了。
③、代码
/**C++ * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) { if (!l1) return l2; if (!l2) return l1; ListNode* l3 = new ListNode(-1); ListNode* p = l3, *q; while(l1 && l2) { if (l1->val < l2->val) { q = new ListNode(l1->val); p->next = q; p = q; l1 = l1->next; } else { q = new ListNode(l2->val); p->next = q; p = q; l2 = l2->next; } } if (l1) l2 = l1; p->next = l2; return l3->next; } };
# Definition for singly-linked list. # class ListNode(object): # def __init__(self, x): # self.val = x # self.next = None class Solution(object): def mergeTwoLists(self, l1, l2): """ :type l1: ListNode :type l2: ListNode :rtype: ListNode """ """递归做法""" if l1 is None: return l2 if l2 is None: return l1 elif l1.val < l2.val: l1.next = self.mergeTwoLists(l1.next, l2) return l1 else: l2.next = self.mergeTwoLists(l1, l2.next) return l2 """ prehead = ListNode(-1) prev = prehead while l1 and l2: if l1.val <= l2.val: prev.next = l1 l1 = l1.next else: prev.next = l2 l2 = l2.next prev = prev.next prev.next = l1 if l1 is not None else l2 return prehead.next
作者:Ryanjie
出处:http://www.cnblogs.com/ryanjan/
本文版权归作者和博客园所有,欢迎转载。转载请在留言板处留言给我,且在文章标明原文链接,谢谢!
如果您觉得本篇博文对您有所收获,觉得我还算用心,请点击右下角的 [推荐],谢谢!