关闭

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

标签: leetcode合并排序链表merge
520人阅读 评论(0) 收藏 举报
分类:
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

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:84233次
    • 积分:2041
    • 等级:
    • 排名:第18855名
    • 原创:125篇
    • 转载:8篇
    • 译文:0篇
    • 评论:16条
    文章分类
    最新评论