leetCode 21.Merge Two Sorted Lists (合并排序链表) 解题思路和方法

Merge Two Sorted Lists 

Merge two sorted linked lists and return it as a new list. The new list should be made by splicing together the nodes of the first two lists.


思路:对两个已排序的单链表合并。算法上比较简单,与归并排序类似。只是数据结构上以前学的,现在忘的比较多,写第一遍的时候比较费力。而且想把重复代码写出方法,但是方法怎么都不能同步改变参数的值,没办法,第一遍力求准确,先A过再说。

代码有点乱,不过理解还是比较方便。如下:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
public class Solution {
    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        ListNode head = null;
        ListNode p = null;
        
        //从小到大的顺序合并链表
        while(l1 != null && l2 != null){
            if(l1.val > l2.val){
            	if(head == null){
            		head = p = l2;
            	}else{
            		p.next = l2;
            		p = p.next;
            	}
            	l2 = l2.next;
            }else{
            	if(head == null){
            		head = p = l1;
            	}else{
            		p.next = l1;
            		p = p.next;
            	}
            	l1 = l1.next;
            }
        }
        //如果链表中还有数据,继续合并,以下最多只有一个链表还有数据
        while(l1 != null){
        	if(head == null){
        		head = p = l1;
        	}else{
        		p.next = l1;
        		p = p.next;
        	}
        	l1 = l1.next;
        }
        while(l2 != null){
        	if(head == null){
        		head = p = l2;
        	}else{
        		p.next = l2;
        		p = p.next;
        	}
        	l2 = l2.next;
        }
        p = null;
        return head;
    }
}

顺利A过之后考虑精简代码,因为上面的代码看着实在不舒服,网上参考一些资料,受启发后写出如下代码。

PS:两个代码的效果都差不多。

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
public class Solution {
    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        if(l1 == null || l2 == null)
            return l1 == null ? l2:l1;
        ListNode head = new ListNode(0);//定义一个头结点
        ListNode p = head;
        ListNode temp = null;
        
        while(l1 != null && l2 != null){
            if(l1.val > l2.val){
                temp = l2;//用一个temp保存现在的l1或l2
                l2 = l2.next;//l1或l2指针后移1位
            }else{
                temp = l1;
                l1 = l1.next;
            }//交换数据
            p.next = temp;
            p = p.next;
        }//temp取不为空的一个(也可能全为空)
        temp = l1 == null ?l2:l1;
        p.next = temp;//将剩余的全部链接即可(上面的方法太啰嗦了)
        return head.next;
    }
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值