【题25 合并两个排序链表】

【题25 合并两个排序链表】
【题目】
输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然使递增排序的。
例如:
输入途中的链表1和链表2,则合并之后的升序,如链表3。
在这里插入图片描述

常见问题:

  1. 没想清楚合并过程,最终合并出来的链表要断开,要么并没有做到递增排序。
  2. 代码在鲁棒性方面存在问题

分析

  1. 合并过程(典型的回归问题)
    (1) 首先分析头节点,链表1头节点小于链表2头节点值
    (2) 剩余的依然比较头节点
    在这里插入图片描述
  2. 鲁棒性问题
    每当代码试图访问空指针指向的内存时程序会崩溃
    一旦输入空的链表就会引起空的指针要对空链表单独处理
  • 当第一个链表时空链表,即头节点是一个空指针时,把它和第二个链表合并,合并链表结果时第二个链表
  • 当第二个链表时空链表,即头节点是一个空指针时,把它和第一个链表合并,合并链表结果时第一个链表
  • 当两个链表都是空链表,合并结果是空链表。

实现

package ti25;
/**
 * 合并两个排序的链表
 */
//题目:输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按
//照递增排序的。

public class MergeSortedLists {
  /*
   * 递归版本
   */
  public ListNode merge(ListNode list1,ListNode list2) {
      if(list1==null) return list2;
      if(list2==null) return list1;
      if(list1.val<list2.val) {
          list1.next=merge(list1.next, list2);
          return list1;
      }else {
          list2.next=merge(list1, list2.next);
          return list2;
      }
  }
   
  /*
   * 非递归
   */
  public class Solution {
    public ListNode Merge(ListNode list1,ListNode list2) {
        if(list1 == null){
            return list2;
        }
        if(list2 == null){
            return list1;
        }
        ListNode tempHead =null;
        ListNode p = null;
        while(list1 != null &&list2 != null){
            if(list1.val<list2.val){
                if(tempHead == null){
                    tempHead = p = list1;
                }
                else{
                    p.next = list1;
                    p = p.next;
                }
                list1 = list1.next;
            }
            else{
                if(tempHead == null){
                    tempHead = p = list2;
                }
                else{
                    p.next = list2;
                    p = p.next;
                }
                list2 = list2.next;
            }
            if(list1 == null){
                p.next = list2;
            }else{
                p.next = list1;
            }
        }
        return tempHead;
    }
}
    
    public static void main(String[] args) {
    	MergeSortedLists msl = new MergeSortedLists();
    	 
		ListNode pHead = new ListNode();
		ListNode pAhead = new ListNode();
		ListNode pBhead = new ListNode();
		ListNode pChead = new ListNode();
		
		pHead.val = 1;
		pAhead.val = 3;
		pBhead.val = 5;
		pChead.val = 7;
		
		pHead.next = pAhead;
		pAhead.next = pBhead;
		pBhead.next = pChead;
		ListNode p1Head = new ListNode();
		ListNode p2head = new ListNode();
		ListNode p3head = new ListNode();
		ListNode p4head = new ListNode();
		
		p1Head.val = 2;
		p2head.val = 4;
		p3head.val = 6;
		p4head.val = 8;
		
		p1Head.next = p2head;
		p2head.next = p3head;
		p3head.next = p4head;
		p1Head = msl.merge(pHead,p1Head);
		while (p1Head != null) {
			System.out.print(p1Head.val + ",");
			p1Head = p1Head.next;
		}
		System.out.println("******************************");
		p1Head = msl.merge2(pHead,p1Head);
		while (p1Head != null) {
			System.out.print(p1Head.val + ",");
			p1Head = p1Head.next;
		}
 
	}

}

class ListNode {
    int val;
    ListNode next;
}

猜你喜欢

转载自blog.csdn.net/weixin_39795049/article/details/86548762
今日推荐