21. 合并两个有序链表-E

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/scylhy/article/details/87967180

21. 合并两个有序链表-E

将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

示例:

输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4

输入:[]
输出:[1]

  • 分析
    这道题,就是合并两个链表,使用方法就是,两层循环,外层l1迭代,内层l2迭代,这样l1肯定能迭代完,但是l2可能剩下部分,故最后再对剩下的l2迭代;
    新学到的,dummy Head,方法,再不用处理p==nil的问题了,可以直接使用p.Next;最后返回head.Next就行,巧啊。

  • code2

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func mergeTwoLists(l1 *ListNode, l2 *ListNode) *ListNode {
    var head,p *ListNode
    head=&ListNode{0,nil};p=head //dumyhead,不用再处理p==nil的情况,直接用p.Next就行
    for l1!=nil {   //双层,每层控制一个链的思路清晰,比较容易;若两个链都在一个循环控制就稍微复杂了
        for l2!=nil&&l2.Val<=l1.Val{
            p.Next=l2;p=p.Next;l2=l2.Next
        }
        p.Next=l1;p=p.Next;l1=l1.Next
    }       
    p.Next=l2 //最后剩下的,l2,也不用遍历了,直接链上头就可以了
    return head.Next
}
  • code1
/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func mergeTwoLists(l1 *ListNode, l2 *ListNode) *ListNode {
    var head,p *ListNode
    for l1!=nil {
        for l2!=nil&&l2.Val<=l1.Val{
            if p==nil{
                p=l2;head=p
            }else{
                p.Next=l2;p=p.Next
            }
            l2=l2.Next
        }
        if p==nil{
            p=l1;head=p
        }else{
            p.Next=l1;p=p.Next
        }
        l1=l1.Next
    }
    for l2!=nil{
        if p==nil{
            p=l2;head=p
        }else{
            p.Next=l2;p=p.Next
        }
        l2=l2.Next  
    }
    return head
}

猜你喜欢

转载自blog.csdn.net/scylhy/article/details/87967180