Java同学的面试算法学习 2

44 阅读1分钟

合并两个排序的链表

题目

image-20231223204045261

image-20231223204100229

思路

使用递归的方法

  • 终止条件:一个链表为空,直接返回另外一个链表

  • 返回值:返回拼接好的子链表

  • 本级任务:判断得到值较小的节点,传入该节点的后继与另外一个链表进行合并,再将本次的节点接在后面拼好的结果前面

步骤

  1. 每次比较两个链表当前节点的值,然后取较小值的链表指针往后,另一个不变,两段子链表作为新的链表送入递归中。
  2. 递归回来的结果我们要加在当前较小值的节点后面,相当于不断在较小值后面添加节点

代码

import java.util.*;

/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 *   public ListNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param pHead1 ListNode类
     * @param pHead2 ListNode类
     * @return ListNode类
     */
    public ListNode Merge (ListNode pHead1, ListNode pHead2) {
        // write code here
        if (pHead1 == null) {
            return pHead2;
        }
        if (pHead2 == null) {
            return pHead1;
        }
        if (pHead1.val <= pHead2.val) {
            pHead1.next = Merge(pHead1.next, pHead2);
            return pHead1;
        }
        else {
            pHead2.next = Merge(pHead1, pHead2.next);
            return pHead2;
        }
    }
}

总结:

链表和树的题先思考有没有重复的情况,先考虑使用==递归==来解题

递归的模板

  • 结束条件
  • 本级任务
  • 返回值