21. 合并两个有序链表
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
ListNode dummy = new ListNode(-1);
ListNode cur = dummy;
while (l1 != null && l2 != null) {
if (l1.val < l2.val) {
cur.next = l1;
cur = cur.next;
l1 = l1.next;
} else {
cur.next = l2;
cur = cur.next;
l2 = l2.next;
}
}
if (l1 != null) {
cur.next = l1;
}
if (l2 != null ) {
cur.next = l2;
}
return dummy.next;
}
}22. 括号生成
能往里面加左括号的前提是左括号的数量小于右括号, 右括号能往里加的前提是小于等于规定的数量n
class Solution {
int n;
List<String> res;
public List<String> generateParenthesis(int n) {
this.n = n;
res = new ArrayList();
dfs(0, 0, new StringBuilder());
return res;
}
private void dfs(int lc, int rc, StringBuilder builder) {
if (lc == n && rc == n) {
res.add(builder.toString());
} else {
if (lc < n) {
dfs(lc + 1, rc, new StringBuilder(builder).append('('));
}
if ( rc < lc) {
dfs(lc, rc + 1, new StringBuilder(builder.append(')')));
}
}
}
}23. 合并K个升序链表
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode mergeKLists(ListNode[] lists) {
Queue<ListNode> pq = new PriorityQueue<>((v1, v2) -> v1.val - v2.val);
for (ListNode list : lists) {
if (list != null) {
pq.offer(list);
}
}
ListNode dummy = new ListNode(-1);
ListNode cur = dummy;
while (!pq.isEmpty()) {
ListNode node = pq.poll();
cur.next = node;
cur = cur.next;
if(node.next != null) {pq.offer(node.next);}
}
return dummy.next;
}
}24. 两两交换链表中的节点
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode swapPairs(ListNode head) {
ListNode dummy = new ListNode(-1);
dummy.next = head;
ListNode cur = dummy;
while(cur.next != null && cur.next.next != null) {
ListNode p = cur.next;
ListNode q = cur.next.next;
cur.next = q;
p.next = q.next;
q.next = p;
cur = p;
}
return dummy.next;
}
}
京公网安备 11010502036488号