두 개의 질서 있 는 링크 21 을 통합 합 니 다.
사고의 방향
우 리 는 다음 과 같이 두 개의 링크 에 있 는 merge 작업 (경계 상황 무시, 예 를 들 어 빈 링크 등) 을 재 귀적 으로 정의 할 수 있다. 즉, 두 개의 링크 의 머리 값 이 비교적 작은 노드 와 나머지 요소 의 merge 작업 결과 가 합 쳐 진 것 이다.알고리즘 은 우리 가 상기 귀속 과정 을 직접 모델 링 하 는 동시에 경계 상황 을 고려 해 야 한다.만약 l1 또는 l2 가 처음부터 빈 링크 였 다 면 어떠한 조작 도 합병 할 필요 가 없 기 때문에 우 리 는 비 빈 링크 로 돌아 가 야 합 니 다.그렇지 않 으 면 우 리 는 l1 과 l2 의 어느 링크 의 머리 노드 의 가치 가 더 작은 지 판단 한 다음 에 다음 에 결과 에 추 가 된 노드 를 재 귀적 으로 결정 해 야 한다.만약 두 개의 체인 시계 가 하나 가 비어 있다 면, 귀속 은 끝난다.
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
if (l1 == null) {
return l2;
}
else if (l2 == null) {
return l1;
}
else if (l1.val < l2.val) {
l1.next = mergeTwoLists(l1.next, l2);
return l1;
}
else {
l2.next = mergeTwoLists(l1, l2.next);
return l2;
}
}
}
복잡 도 분석
:O(n + m, n m 。 l1 l2 ( ), mergeTwoList 。 , , O(n+m)。
:O(n + m), n m 。 mergeTwoLists , 。 mergeTwoLists n+m , O(n+m)。
방법 2: 교체
사고의 방향
우 리 는 반복 적 인 방법 으로 상술 한 알고리즘 을 실현 할 수 있다.l1 과 l2 가 모두 빈 링크 가 아 닐 때 l1 과 l2 의 어느 링크 의 머리 노드 의 값 이 더 작은 지 판단 하고 작은 값 의 노드 를 결과 에 추가 합 니 다. 한 노드 가 결과 에 추 가 된 후에 해당 하 는 링크 의 노드 를 뒤로 이동 합 니 다.
알고리즘
1. 우선, 우 리 는 보초병 노드 prehead 를 설정 합 니 다. 이것 은 마지막 에 합병 후의 링크 로 쉽게 돌아 갈 수 있 습 니 다.우 리 는 prev 지침 을 유지 합 니 다. 우리 가 해 야 할 일 은 next 지침 을 조정 하 는 것 입 니 다.그 다음 에 우 리 는 l1 또는 l2 가 null 을 가리 킬 때 까지 다음 과 같은 과정 을 반복 합 니 다. 만약 에 l1 현재 노드 의 값 이 l2 보다 작 으 면 우 리 는 l1 현재 노드 를 prev 노드 뒤에 연결 하 는 동시에 l1 지침 을 한 자리 뒤로 이동 합 니 다.그렇지 않 으 면, 우 리 는 l2 에 대해 같은 조작 을 한다.우리 가 어떤 요 소 를 뒤에 연결 하든지 간 에 우 리 는 prev 를 뒤로 옮 겨 야 한다.
2. 순환 이 종 료 될 때 l1 과 l2 는 대부분 비 어 있 습 니 다.입력 한 두 개의 링크 는 모두 질서 가 있 기 때문에 어떤 링크 가 비어 있 든 지 간 에 모든 요 소 는 앞에서 합 쳐 진 링크 의 모든 요소 보다 크다.이것 은 우리 가 비 공 링크 를 합병 링크 의 뒤에 간단하게 연결 하고 합병 링크 로 돌아 가면 된다 는 것 을 의미한다.
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
ListNode prehead = new ListNode(-1);
ListNode prev = prehead;
while (l1 != null && l2 != null) {
if (l1.val <= l2.val) {
prev.next = l1;
l1 = l1.next;
} else {
prev.next = l2;
l2 = l2.next;
}
prev = prev.next;
}
// l1 l2 ,
prev.next = l1 == null ? l2 : l1;
return prehead.next;
}
}
복잡 도 분석
:O(n + m) , n m 。 ,l1 l2 , while 。 , O(n+m)。
:O(1) 。 。
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
0부터 시작하는 LeetCode Day8 「1302. Deepest Leaves Sum」해외에서는 엔지니어의 면접에 있어서 코딩 테스트라고 하는 것이 행해지는 것 같고, 많은 경우, 특정의 함수나 클래스를 주제에 따라 실장한다고 하는 것이 메인이다. 빠른 이야기가 본고장에서도 행해지고 있는 것 같은 코...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.